package com.pingan.haofang.searchcloud.index.service;

import java.util.List;
import java.util.Optional;

import com.pingan.haofang.searchcloud.common.dto.OperationResult;
import com.pingan.haofang.searchcloud.common.dto.PageDTO;
import com.pingan.haofang.searchcloud.index.domain.Index;
import com.pingan.haofang.searchcloud.index.dto.IndexDTO;
import com.pingan.haofang.searchcloud.index.dto.IndexInfoDTO;
import com.pingan.haofang.searchcloud.index.dto.IndexInfoQueryResult;
import com.pingan.haofang.searchcloud.index.dto.IndexQueryDTO;
import com.pingan.haofang.searchcloud.index.dto.IndexQueryResult;
import com.pingan.haofang.searchcloud.quartz.dto.TaskQueryDto;

/**
 * 索引Service
 *
 * @author baojie371
 * @date 17/5/3
 * @since 1.0.0
 */
public interface IndexService {

    /**
     * 索引列表查询
     *
     * @param query
     * @return
     */
    PageDTO<IndexQueryResult> query(IndexQueryDTO query);
    
    /**
     * 根据项目id查询启用索引
     *
     * @param query
     * @return
     */
    List<IndexDTO> queryByProjectId(long projectId);
    
    /**
     * 索引信息查询
     *
     * @param id
     * @return
     */
    IndexInfoQueryResult queryById(long id);

    /**
     * 索引基本信息查询
     *
     * @param id
     * @return
     */
    IndexQueryResult queryBasicInfoById(long id);

    /**
     * 索引保存
     *
     * @param indexInfo
     * @return
     */
    long save(IndexInfoDTO indexInfo);

    /**
     * 启用索引
     *
     * @param id
     * @param force
     */
    OperationResult enableIndex(long id, boolean force);


    /**
     * 根据条件查询
     *
     * @return
     */
    List<IndexQueryResult> queryAllIndexOfStorage(TaskQueryDto dto);

    /**
     * 根据索引名称查询索引信息
     *
     * @param indexName
     * @return
     */
    IndexInfoQueryResult queryByIndexNameOfStorage(String indexName);

    /**
     * 根据索引名称和Collection名称查询索引信息
     *
     * @param indexName
     * @param collectionName
     * @return
     */
    IndexInfoQueryResult queryByIndexNameAndCollectionNameOfStorage(String indexName, String collectionName);

    /**
     * 获取主键名
     *
     * @param indexName
     * @return
     */
    Optional<String> findPKFieldNameOfStorage(String indexName);

    /**
     * 根据indexName生成 collectionName = ${indexName}_${version} 根据indexName 获取 mateid 获取 configName =
     * ${configName}_${configVersion} 调用 CollectionManagerService.create(CollectionMetaData)
     *
     * @param projectCode
     * @param indexName
     * @return
     */
    String getOrCreateCollectionOfStorage(String projectCode, String indexName);

    /**
     * 获取当前生效的Collection
     *
     * @param projectCode
     * @param indexName
     * @return
     */
    String getCollectionOfStorage(String projectCode, String indexName);

    /**
     * 注册
     *
     * @param projectCode
     * @param indexName
     * @param collectionName
     */
    void registerCollectionOfStorage(String projectCode, String indexName, String collectionName);

    int countIndex();

    List<Index> getByindexIds(List<Long> indexIds);

}
